package plugins

import (
	"fmt"
	"sync"
)

// PluginParamInfo 插件参数信息
type PluginParamInfo struct {
	Name        string // 参数名称
	Description string // 参数描述
	Required    bool   // 是否必需
	Default     string // 默认值（若有）
}

// Plugin 定义插件接口
type Plugin interface {
	// Execute 执行插件功能
	Execute(args map[string]interface{}) error
	// GetDescription 获取插件描述
	GetDescription() string
	// GetRequiredParams 获取插件所需参数
	GetRequiredParams() []PluginParamInfo
}

// PluginInfo 存储插件信息
type PluginInfo struct {
	Name        string
	Description string
	Plugin      Plugin
}

// PluginManager 插件管理器
type PluginManager struct {
	plugins map[string]*PluginInfo
	mu      sync.RWMutex
}

// NewPluginManager 创建新的插件管理器
func NewPluginManager() *PluginManager {
	return &PluginManager{
		plugins: make(map[string]*PluginInfo),
	}
}

// RegisterPlugin 注册新插件
func (pm *PluginManager) RegisterPlugin(name, description string, plugin Plugin) {
	pm.mu.Lock()
	defer pm.mu.Unlock()

	pm.plugins[name] = &PluginInfo{
		Name:        name,
		Description: description,
		Plugin:      plugin,
	}
}

// GetPlugin 获取指定插件
func (pm *PluginManager) GetPlugin(name string) (Plugin, error) {
	pm.mu.RLock()
	defer pm.mu.RUnlock()

	if plugin, exists := pm.plugins[name]; exists {
		return plugin.Plugin, nil
	}
	return nil, fmt.Errorf("插件 %s 不存在", name)
}

// GetPluginInfo 获取指定插件信息
func (pm *PluginManager) GetPluginInfo(name string) (*PluginInfo, error) {
	pm.mu.RLock()
	defer pm.mu.RUnlock()

	if plugin, exists := pm.plugins[name]; exists {
		return plugin, nil
	}
	return nil, fmt.Errorf("插件 %s 不存在", name)
}

// ListPlugins 列出所有可用插件
func (pm *PluginManager) ListPlugins() []*PluginInfo {
	pm.mu.RLock()
	defer pm.mu.RUnlock()

	plugins := make([]*PluginInfo, 0, len(pm.plugins))
	for _, plugin := range pm.plugins {
		plugins = append(plugins, plugin)
	}
	return plugins
}
